home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / obrn-a_1.5_src.lha / oberon-a / source3.lha / Source / OEL / OEL.mod < prev    next >
Encoding:
Text File  |  1995-01-23  |  10.1 KB  |  329 lines

  1. (*
  2.  *      $DESCRIPTION: Oberon-A Error Lister $
  3.  *      $AUTHOR: Johan Ferreira $
  4.  *)
  5.  
  6. <* STANDARD- *>
  7.  
  8. MODULE  OEL;
  9.  
  10. IMPORT  SYSTEM, Exec, Dos, Locale, ErrorMessages, OELRev, Strings,
  11.         IO := BufIO, ANSI, Msg := OELMsg, Errors, Kernel;
  12.  
  13.  
  14. CONST   numOfArgs = 11;
  15.         defModulePostfix = ".mod";
  16.         defErrPostfix = ".err";
  17.         defColWidth = 71;
  18.         defColSeperator = " ";
  19.         defTagLength = 1;
  20.         defTabSize = 8;
  21.         defErrPath = "T:";
  22.  
  23.         oaerIdSTR = "OAER";
  24.         eclipseSTR = "...";
  25.         programName = "OEL";
  26.         maxString = 256;
  27.  
  28.  
  29. VAR     E, R, W: Dos.FileHandlePtr;
  30.         errline, errcol, preverrline, errno: INTEGER;
  31.         modline, modcol: INTEGER;
  32.         tab: INTEGER;
  33.         eclipse, bool: BOOLEAN;
  34.         i, m, n: LONGINT;
  35.         strptr, errstrptr, prgname: Exec.LSTRPTR;
  36.  
  37.         module, modulePostfix, errPostfix, colSeperator, errPath: Exec.LSTRPTR;
  38.         colWidth, tagLength, tabSize: LONGINT;
  39.         lineNumbers, errNumbers(*, ansi*): BOOLEAN;
  40.         argarray: ARRAY numOfArgs OF SYSTEM.LONGWORD;
  41.         argresult: Dos.RDArgsPtr;
  42.  
  43.  
  44. PROCEDURE PrintFault ();
  45. BEGIN
  46.         IF Dos.PrintFault (Dos.IoErr (), prgname^) THEN END
  47. END PrintFault;
  48.  
  49.  
  50. PROCEDURE WriteLineNumber ();
  51. BEGIN
  52.         IF lineNumbers THEN
  53.                 ANSI.BoldfaceText (W, FALSE, TRUE);
  54.                 IO.WriteF1 (W, "%-4ld", LONG (modline));
  55.                 ANSI.PlainText (W);
  56.                 IO.WriteStr (W, colSeperator^)
  57.         END
  58. END WriteLineNumber;
  59.  
  60.  
  61. PROCEDURE WriteLine ();
  62. BEGIN
  63.         WriteLineNumber ();
  64.  
  65.         LOOP    IF (strptr^[i] # 00X) & (strptr^[i] # 0AX) THEN
  66.                         IF strptr^[i] = 09X THEN
  67.                                 n := tabSize - (modcol MOD tabSize);
  68.                                 WHILE n > 0 DO
  69.                                         IF ((modcol+1) MOD colWidth # 0) THEN
  70.                                                 IO.Write (W, " ");
  71.                                                 INC (modcol); DEC (n)
  72.                                         ELSE    INC (modcol, SHORT (n)); n := 0;
  73.                                                 INC (i); EXIT
  74.                                         END;
  75.                                 END
  76.                         ELSE
  77.                                 IO.Write (W, strptr^[i]);
  78.                                 INC (modcol);
  79.                         END;
  80.                         INC (i)
  81.                 END;
  82.  
  83.                 IF (strptr^[i] = 00X) OR (strptr^[i] = 0AX) THEN
  84.                         modcol := MAX (INTEGER);
  85.                         i := MAX (INTEGER);
  86.                         EXIT
  87.                 ELSIF (modcol MOD colWidth = 0) THEN
  88.                         EXIT
  89.                 END
  90.         END;
  91.         IO.WriteLn (W)
  92. END WriteLine;
  93.  
  94.  
  95. PROCEDURE WriteError ();
  96. BEGIN
  97.         IF lineNumbers THEN IO.WriteStr (W, "    ") END;
  98.         m := ((errcol-1) MOD colWidth) + SYSTEM.STRLEN (colSeperator^);
  99.         WHILE m > 0 DO
  100.                 IO.Write (W, " "); DEC (m)
  101.         END;
  102.         IO.Write (W, "^"); IO.WriteLn (W);
  103.  
  104.         ANSI.ItalicText (W, TRUE);
  105.         IF errNumbers THEN IO.WriteF1 (W, "%ld: ", LONG (errno)) END;
  106.         (* Internal errors *)
  107.         IF (950 < errno) & (errno < 1000) THEN
  108.                 errstrptr := ErrorMessages.GetString (ErrorMessages.msgErr950);
  109.                 IO.WriteStr (W, errstrptr^)
  110.         ELSIF (1000 < errno) & (errno < 1050) THEN
  111.                 errstrptr := ErrorMessages.GetString (ErrorMessages.msgErr1000);
  112.                 IO.WriteStr (W, errstrptr^)
  113.         END;
  114.         errstrptr := ErrorMessages.GetString (errno + 1);
  115.         IF errstrptr # NIL THEN IO.WriteStr (W, errstrptr^)
  116.         ELSE IO.WriteF1 (W, "Error #%ld", errno)
  117.         END;
  118.         IO.WriteLn (W);
  119.         ANSI.PlainText (W)
  120. END WriteError;
  121.  
  122.  
  123. PROCEDURE ReadLine (output: BOOLEAN);
  124. BEGIN
  125.         WHILE output & (i # MAX (INTEGER)) DO
  126.                 WriteLine ()
  127.         END;
  128.  
  129.         IF Dos.FGets (R, strptr^, maxString) = NIL THEN
  130.                 modline := MAX (INTEGER);
  131.                 modcol := MAX (INTEGER)
  132.         ELSE
  133.                 i := 0;
  134.                 INC (modline);
  135.                 modcol := 0
  136.         END
  137. END ReadLine;
  138.  
  139.  
  140. PROCEDURE WriteCopyright ();
  141. BEGIN
  142.         strptr := Msg.GetString (Msg.msgCopyright);
  143.         IO.WriteF1 (NIL, strptr^, SYSTEM.ADR (OELRev.vers))
  144. END WriteCopyright;
  145.  
  146.  
  147. PROCEDURE ParseArgs ();
  148.  
  149. TYPE    LongPtr = POINTER [2] TO ARRAY 1 OF LONGINT;
  150.  
  151. VAR     lp: LongPtr;
  152.  
  153.         PROCEDURE ArgError ();
  154.         BEGIN
  155.                 strptr := Msg.GetString (Msg.msgArgError);
  156.                 IO.WriteF1 (NIL, strptr^, prgname);
  157.                 HALT (Dos.error)
  158.         END ArgError;
  159.  
  160. BEGIN
  161.         FOR n := 0 TO numOfArgs-1 DO argarray[n] := SYSTEM.VAL (SYSTEM.LONGWORD, 0) END;
  162.         argarray[1] := SYSTEM.ADR (defModulePostfix);
  163.         argarray[2] := SYSTEM.ADR (defErrPostfix);
  164.         argarray[4] := SYSTEM.ADR (defColSeperator);
  165.         argarray[10] := SYSTEM.ADR (defErrPath);
  166.  
  167.         strptr := Msg.GetString (Msg.msgTemplate);
  168.         argresult := Dos.OldReadArgs (strptr^, argarray, NIL);
  169.  
  170.         IF argresult = NIL THEN
  171.                 PrintFault ();
  172.                 HALT (Dos.error)
  173.         END;
  174.  
  175.         module := SYSTEM.VAL (Exec.LSTRPTR, argarray[0]);
  176.         modulePostfix := SYSTEM.VAL (Exec.LSTRPTR, argarray[1]);
  177.         errPostfix := SYSTEM.VAL (Exec.LSTRPTR, argarray[2]);
  178.         lp := SYSTEM.VAL (LongPtr, argarray[3]);
  179.         IF lp = NIL THEN colWidth := defColWidth ELSE colWidth := lp[0] END;
  180.         colSeperator := SYSTEM.VAL (Exec.LSTRPTR, argarray[4]);
  181.         lineNumbers := (SYSTEM.VAL (LONGINT, argarray[5]) = 0);
  182.         errNumbers := ~(SYSTEM.VAL (LONGINT, argarray[6]) = 0);
  183.         ANSI.ansi := (SYSTEM.VAL (LONGINT, argarray[7]) = 0);
  184.  
  185.         lp := SYSTEM.VAL (LongPtr, argarray[8]);
  186.         IF lp = NIL THEN tagLength := defTagLength ELSE tagLength := lp[0] END;
  187.         IF tagLength < 0 THEN ArgError () END;
  188.  
  189.         lp := SYSTEM.VAL (LongPtr, argarray[9]);
  190.         IF lp = NIL THEN tabSize := defTabSize ELSE tabSize := lp[0] END;
  191.         IF tabSize <= 0 THEN ArgError () END;
  192.  
  193.         errPath := SYSTEM.VAL (Exec.LSTRPTR, argarray [10]);
  194. END ParseArgs;
  195.  
  196.  
  197. PROCEDURE Init ();
  198. VAR     tag : ARRAY 5 OF CHAR;
  199.  
  200.         PROCEDURE NotErrorFile;
  201.         VAR     msgstrptr: Exec.LSTRPTR;
  202.         BEGIN
  203.                 msgstrptr := Msg.GetString (Msg.msgNotAnErrorFile);
  204.                 IO.WriteF2 (NIL, msgstrptr^, prgname, strptr);
  205.                 HALT (Dos.fail)
  206.         END NotErrorFile;
  207.  
  208. BEGIN
  209.         SYSTEM.NEW (strptr, maxString);
  210.         SYSTEM.NEW (errstrptr, maxString);
  211.         SYSTEM.NEW (prgname, 32);
  212.  
  213.         Msg.OpenCatalog (NIL, "");
  214.         ErrorMessages.OpenCatalog (NIL, "");
  215.  
  216.         IF ~ Dos.GetProgramName (prgname^, 30) THEN prgname := SYSTEM.ADR (programName) END;
  217.  
  218.         ParseArgs ();
  219.         COPY (errPath^, strptr^);
  220.         IF Dos.AddPart (strptr^, module^, maxString) THEN END;
  221.         Strings.Append (errPostfix^, strptr^);
  222.         E := Dos.Open (strptr^, Dos.oldFile);
  223.         IF E # NIL THEN
  224.                 IF Dos.Read (E, tag, 4) = 4 THEN
  225.                         tag [4] := 0X; (* NUL-terminate the string *)
  226.                         IF tag # oaerIdSTR THEN NotErrorFile() END
  227.                 ELSE    NotErrorFile()
  228.                 END;
  229.         END;
  230.         IF E = NIL THEN
  231.                 PrintFault ();
  232.                 HALT (Dos.warn)
  233.         END;
  234.  
  235.         strptr^ := "";
  236.         Strings.Append (module^, strptr^); Strings.Append (modulePostfix^, strptr^);
  237.         R := Dos.Open (strptr^, Dos.oldFile);
  238.         IF R = NIL THEN
  239.                 PrintFault ();
  240.                 HALT (Dos.fail)
  241.         END;
  242.  
  243.         W := Dos.Output ();
  244.  
  245.         modline := 0; modcol := 0;
  246.         errline := 0; errcol := 0;
  247.         i := MAX (INTEGER)
  248. END Init;
  249.  
  250.  
  251. PROCEDURE *Close (VAR rc : LONGINT);
  252. BEGIN
  253.         ErrorMessages.CloseCatalog ();
  254.         Dos.FreeArgs (argresult);
  255.  
  256.         IF W = Dos.Output () THEN
  257.                 IF Dos.Flush (W) THEN (* Error *) END
  258.         ELSE    IF W # NIL THEN
  259.                         IF Dos.Close (W) THEN (* Error *) END
  260.                 END
  261.         END;
  262.         IF R # NIL THEN
  263.                 IF Dos.Close (R) THEN (* Error *) END
  264.         END;
  265.         IF E # NIL THEN
  266.                 IF Dos.Close (E) THEN (* Error *) END
  267.         END;
  268.  
  269.         Msg.CloseCatalog ()
  270. END Close;
  271.  
  272.  
  273. BEGIN   Errors.Init;
  274.         argresult := NIL; W := NIL; R := NIL; E := NIL;
  275.         Kernel.SetCleanup (Close);
  276.  
  277.         WriteCopyright ();
  278.         Init ();
  279.  
  280.         LOOP    preverrline := errline;
  281.  
  282.                 IF Dos.Read (E, errline, 2) < 2 THEN EXIT END;
  283.                 IF Dos.Read (E, errcol, 2) < 2 THEN EXIT END;
  284.                 IF Dos.Read (E, errno, 2) < 2 THEN EXIT END;
  285.  
  286.                 (* Trailing lines *)
  287.                 WHILE (preverrline # 0) & (modline < preverrline + tagLength) & (modline < errline) DO
  288.                         ReadLine (TRUE)         (* Output *)
  289.                 END;
  290.  
  291.                 (* Skip *)
  292.                 eclipse := FALSE;
  293.                 WHILE (modline < errline - tagLength) DO
  294.                         IF ~eclipse THEN
  295.                                 IO.WriteStr (W, eclipseSTR); IO.WriteLn (W);
  296.                                 eclipse := TRUE
  297.                         END;
  298.                         ReadLine (FALSE)        (* No output *)
  299.                 END;
  300.  
  301.                 (* Leading lines *)
  302.                 WHILE (modline < errline) DO
  303.                         ReadLine (TRUE)         (* Output *)
  304.                 END;
  305.  
  306.                 (* Wrap the line *)
  307.                 WHILE (modcol < errcol) & (i # MAX (INTEGER)) DO
  308.                         WriteLine ()
  309.                 END;
  310.  
  311.                 (* If we reached the end of the source, then end *)
  312.                 IF (modline = MAX (INTEGER)) & (modcol = MAX (INTEGER)) THEN EXIT END;
  313.  
  314.                 WriteError ()
  315.         END;
  316.  
  317.         (* Trailing lines *)
  318.         IF preverrline > errline THEN errline := preverrline END;
  319.         WHILE (errline # 0) & (modline < errline + tagLength) DO
  320.                 ReadLine (TRUE)
  321.         END;
  322.  
  323.         (* If not the end of souce, then write eclipse *)
  324.         IF Dos.FGets (R, strptr^, maxString) # NIL THEN
  325.                 IO.WriteStr (W, eclipseSTR); IO.WriteLn (W)
  326.         END
  327. END OEL.
  328.  
  329.